// API服务工具函数

// 基础URL，实际项目中替换为真实的后端API地址
const BASE_URL = process.env.VITE_API_BASE_URL || '/api'

/**
 * 处理HTTP请求的基础函数
 * @param {string} url - 请求URL
 * @param {string} method - 请求方法
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置选项
 * @returns {Promise<any>}
 */
const request = async (url, method = 'GET', data = null, options = {}) => {
  try {
    // 构建完整的请求URL
    const fullUrl = `${BASE_URL}${url}`
    
    // 构建请求配置
    const config = {
      method,
      headers: {
        'Content-Type': 'application/json',
        ...options.headers
      },
      ...options
    }
    
    // 如果有请求数据，添加到配置中
    if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
      config.body = JSON.stringify(data)
    }
    
    // 检查是否需要添加认证token
    const token = sessionStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    
    // 如果环境变量设置为模拟模式，使用模拟数据
    if (process.env.VITE_USE_MOCK_DATA === 'true') {
      // 模拟网络延迟
      await new Promise(resolve => setTimeout(resolve, 500))
      
      // 返回模拟数据
      return mockRequest(url, method, data)
    }
    
    // 发送真实的HTTP请求
    const response = await fetch(fullUrl, config)
    
    if (!response.ok) {
      throw new Error(`HTTP错误! 状态码: ${response.status}`)
    }
    
    return response.json()
  } catch (error) {
    console.error('API请求失败:', error)
    throw error
  }
}

/**
 * 模拟请求数据生成函数
 * @param {string} url - 请求URL
 * @param {string} method - 请求方法
 * @param {Object} data - 请求数据
 * @returns {Promise<any>}
 */
const mockRequest = (url, method, data) => {
  // 根据不同的API端点返回不同的模拟数据
  if (url.includes('/messages/export') && method === 'POST') {
    const { sessionId, startDate, endDate } = data
    
    // 生成模拟的消息数据
    const mockMessages = generateMockMessages(sessionId, startDate, endDate)
    
    return {
      success: true,
      data: mockMessages,
      message: '数据获取成功'
    }
  }
  
  // 默认返回空数据
  return {
    success: true,
    data: [],
    message: '模拟数据返回'
  }
}

/**
 * 生成模拟的消息数据
 * @param {string} sessionId - 会话ID
 * @param {string} startDate - 开始日期
 * @param {string} endDate - 结束日期
 * @returns {Array}
 */
const generateMockMessages = (sessionId, startDate, endDate) => {
  // 确定日期范围
  const start = startDate ? new Date(startDate) : new Date(Date.now() - 7 * 24 * 60 * 60 * 1000)
  const end = endDate ? new Date(endDate) : new Date()
  
  // 计算日期范围内的天数
  const days = Math.ceil((end - start) / (1000 * 60 * 60 * 24)) + 1
  
  // 生成随机数量的消息（每天5-20条）
  const totalMessages = Math.floor(Math.random() * (days * 15)) + (days * 5)
  
  const messages = []
  const messageTypes = ['text', 'image', 'file', 'voice']
  const senders = [
    { id: 1, username: 'user1', avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=user1' },
    { id: 2, username: 'user2', avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=user2' },
    { id: 3, username: 'customer', avatar: 'https://api.dicebear.com/9.x/avataaars/svg?seed=customer' }
  ]
  
  for (let i = 0; i < totalMessages; i++) {
    // 随机生成消息发送时间（在日期范围内）
    const randomTime = new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()))
    randomTime.setHours(Math.floor(Math.random() * 24), Math.floor(Math.random() * 60), Math.floor(Math.random() * 60))
    
    // 随机选择消息类型
    const messageType = messageTypes[Math.floor(Math.random() * messageTypes.length)]
    
    // 根据消息类型生成不同的内容
    let content = ''
    switch (messageType) {
      case 'text':
        content = generateRandomText()
        break
      case 'image':
        content = `https://picsum.photos/800/600?random=${Math.floor(Math.random() * 1000)}`
        break
      case 'file':
        content = `document_${Math.floor(Math.random() * 1000)}.pdf`
        break
      case 'voice':
        content = `audio_${Math.floor(Math.random() * 1000)}.mp3`
        break
    }
    
    // 随机选择发送者
    const sender = senders[Math.floor(Math.random() * senders.length)]
    
    messages.push({
      id: Date.now() + i,
      sessionId: sessionId || `session_${Math.floor(Math.random() * 1000)}`,
      sender: sender,
      type: messageType,
      content: content,
      sendTime: randomTime.toISOString(),
      read: Math.random() > 0.3
    })
  }
  
  // 按发送时间排序
  messages.sort((a, b) => new Date(a.sendTime) - new Date(b.sendTime))
  
  return messages
}

/**
 * 生成随机文本内容
 * @returns {string}
 */
const generateRandomText = () => {
  const texts = [
    '您好，我想咨询一下产品信息。',
    '请问这个功能是如何使用的？',
    '非常感谢您的帮助！',
    '我遇到了一个问题，希望能得到解决。',
    '这个产品的价格是多少？',
    '请问有什么优惠活动吗？',
    '好的，我明白了，谢谢你的解释。',
    '期待您的回复。',
    '我想了解更多关于这个服务的细节。',
    '请问如何申请退款？',
    '我们的合作很愉快！',
    '这个功能非常实用。',
    '我对你们的解决方案很感兴趣。',
    '请问有技术支持吗？',
    '这个产品有什么特色功能？'
  ]
  
  return texts[Math.floor(Math.random() * texts.length)]
}

/**
 * GET请求
 * @param {string} url - 请求URL
 * @param {Object} params - URL参数
 * @param {Object} options - 其他配置选项
 * @returns {Promise<any>}
 */
export const get = (url, params = {}, options = {}) => {
  // 构建带参数的URL
  const urlWithParams = new URL(`${BASE_URL}${url}`, window.location.origin)
  Object.entries(params).forEach(([key, value]) => {
    urlWithParams.searchParams.append(key, value)
  })
  
  return request(urlWithParams.pathname + urlWithParams.search, 'GET', null, options)
}

/**
 * POST请求
 * @param {string} url - 请求URL
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置选项
 * @returns {Promise<any>}
 */
export const post = (url, data = {}, options = {}) => {
  return request(url, 'POST', data, options)
}

/**
 * PUT请求
 * @param {string} url - 请求URL
 * @param {Object} data - 请求数据
 * @param {Object} options - 其他配置选项
 * @returns {Promise<any>}
 */
export const put = (url, data = {}, options = {}) => {
  return request(url, 'PUT', data, options)
}

/**
 * DELETE请求
 * @param {string} url - 请求URL
 * @param {Object} options - 其他配置选项
 * @returns {Promise<any>}
 */
export const del = (url, options = {}) => {
  return request(url, 'DELETE', null, options)
}

/**
 * 导出指定会话和时间范围内的消息
 * @param {string} sessionId - 会话ID
 * @param {string} startDate - 开始日期
 * @param {string} endDate - 结束日期
 * @returns {Promise<any>}
 */
export const exportSessionMessages = async (sessionId, startDate = null, endDate = null) => {
  return post('/messages/export', {
    sessionId,
    startDate,
    endDate
  })
}

export default { get, post, put, del, exportSessionMessages }